home *** CD-ROM | disk | FTP | other *** search
/ Apple II Magazines (PO) / Nibble Volume 12, No. 05 (1991-05)(MindCraft Publishing)(Side A).zip / Nibble Volume 12, No. 05 (1991-05)(MindCraft Publishing)(Side A).po / AMPERSOUND.GS.S < prev    next >
Text File  |  1996-12-24  |  10KB  |  318 lines

  1. ******************************************
  2. *                                        *
  3. *   AmperSound - IIGS Sound from BASIC   *
  4. *            by Eric Shepherd            *
  5. * (C) 1991 by MindCraft Publishing Corp. *
  6. *           Lincoln, MA 01773            *
  7. *                                        *
  8. *  Command summary:                      *
  9. *          &ON <osc>,<freq>,<vol>        *
  10. *              [turn on an oscillator]   *
  11. *          &EXP <osc>,<freq>,<att>,      *
  12. *                 <sust>,<decay>         *
  13. *          &STOP <osc>                   *
  14. *              [turn off an oscillator]  *
  15. *          &L <osc>,<vol>                *
  16. *              [set loudness of          *
  17. *               oscillator]              *
  18. *          &LOAD <startadrs>             *
  19. *              [Copy a waveform into     *
  20. *               dedicated Sound RAM]     *
  21. *          &WAIT <length>                *
  22. *              [Wait for given time]     *
  23. *                                        *
  24. *********** Merlin Pro Assembler *********
  25.  
  26. * NOTE: The ORG is set this low to accomadate
  27. *       SuperGraphics GS.
  28.  
  29.           ORG $8C70
  30.           EXP OFF
  31.           XC
  32.           XC
  33.  
  34. ********************************
  35. * Zero page equates
  36. ********************************
  37.  
  38. LINNUM    EQU $50        ;Result of convert
  39. CHRGET    EQU $B1        ;Get byte of cmd
  40. CHRGOT    EQU $B7
  41. OLDAMP    EQU $FA        ;Old ampersand command
  42. ATTACK    EQU $FC
  43. SUSTAIN   EQU $FD
  44. DECAY     EQU $FE
  45.  
  46. ********************************
  47. * Ampersand vector
  48. ********************************
  49.  
  50. AMPER     EQU $3F5       ;Ampersand vector
  51.  
  52. ********************************
  53. * Sound equates
  54. ********************************
  55.  
  56. SCREG     EQU $C03C      ;DOC Sound Ctrl Reg
  57. SNDDAT    EQU $C03D      ;Sound RAM 'window'
  58. ADRSREG1  EQU $C03E      ;Sound Adrs Reg low
  59. ADRSREG2  EQU $C03F      ;Sound Adrs Reg high
  60.  
  61. ********************************
  62. * ROM Equates
  63. ********************************
  64.  
  65. FRMNUM    EQU $DD67      ;Eval real exprn
  66. CHKCOM    EQU $DEBE      ;Check for a comma
  67. BADQUANT  EQU $E199      ;Illegal Quantity Err
  68. EVAL255   EQU $E6F5      ;Eval int exprn <256
  69. COMBYT    EQU $E74C      ;Skip comma, eval exprn
  70. GETADR    EQU $E752      ;Convert real to int
  71. DELAY     EQU $FCA8      ;Delay
  72.  
  73. ********************************
  74. * Install AmperSound GS
  75. ********************************
  76.  
  77.           LDA AMPER+1    ;Get old
  78.           STA OLDAMP     ; ampersand vector
  79.           LDA AMPER+2    ; and save it for
  80.           STA OLDAMP+1   ; future use
  81.  
  82.           LDA #$4C       ;JMP opcode
  83.           STA AMPER      ;Save in & vector
  84.           LDA #START     ;Get LOB of start address
  85.           STA AMPER+1    ;Save it
  86.           LDA #>START    ;Get HOB of start address
  87.           STA AMPER+2    ;Save it
  88.           RTS            ;Back to BASIC, &Sound ready
  89.  
  90. ******************************************
  91. * Find commands
  92. ******************************************
  93.  
  94. START     LDX #6
  95. :1        CMP :TOKENS,X
  96.           BEQ :FOUND
  97.           DEX
  98.           BPL :1
  99.           JMP (OLDAMP)
  100.  
  101. :TOKENS   DFB 180,182,179,'L'
  102.           DFB 181,221
  103.  
  104. :FOUND    TXA
  105.           ASL
  106.           TAX
  107.           JMP (:ADRS,X)
  108.  
  109. :ADRS     DW ON
  110.           DW LOAD
  111.           DW STOP
  112.           DW VOL
  113.           DW WAIT
  114.           DW EXP
  115.  
  116. ******************************************
  117. * Turn ON an oscillator
  118. * &ON <osc>,<freq>,<vol>
  119. ******************************************
  120.  
  121. ON        HEX AFCA00E1   ;LDA $E100CA
  122.                          ; Get sound interrup stat
  123.           STA SCREG      ;DOC reg write ON
  124.           JSR EVAL255    ;Eval exprn, skip comma
  125.           STX $3A        ;Save oscillator # for later
  126.           JSR OSCCHK     ;Check for legal value
  127.           JSR CHKCOM     ;Skip comma
  128.           JSR FRMNUM     ;Get frequency
  129.           JSR GETADR     ;Convert to integer
  130.           PHA
  131.           TYX
  132.  
  133.           LDA #$00       ;Set low byte of frequency
  134.           JSR SETREG     ;Execute
  135.  
  136.           PLX
  137.           LDA #$20       ;Set high byte of frequency
  138.           JSR SETREG     ;Execute
  139.           JSR COMBYT     ;Get volume
  140.           LDA #$40       ;Set volume
  141.           JSR SETREG     ;Execute
  142.  
  143.           LDA #$80       ;Set address of waveform
  144.           LDX #$00       ;Starts at $0000 in sound RAM
  145.           JSR SETREG     ;Execute
  146.            LDA  #$A0     ;Set up the oscillator
  147.            JSR  SETREG   ;Execute
  148.           LDA #$C0       ;Set waveform size to 256 bytes
  149.           JSR SETREG     ;Execute
  150.           RTS            ;Return to BASIC
  151.  
  152. ******************************************
  153. * &EXP <attack>,<sust>,<decay>,<osc>,<freq>
  154. ******************************************
  155.  
  156. EXP       HEX AFCA00E1
  157.           STA SCREG
  158.           JSR EVAL255    ;Get oscillator
  159.           STX $3A
  160.           JSR OSCCHK
  161.           JSR CHKCOM
  162.           JSR FRMNUM
  163.           JSR GETADR
  164.           PHA
  165.           TYX
  166.           LDA #$00
  167.           JSR SETREG
  168.           PLX
  169.           LDA #$20
  170.           JSR SETREG
  171.           LDX #$00
  172.           LDA #$40
  173.           JSR SETREG
  174.           LDA #$80
  175.           JSR SETREG
  176.           LDA #$A0
  177.           JSR SETREG
  178.           LDA #$C0
  179.           JSR SETREG
  180.  
  181.           JSR COMBYT     ;Get attack
  182.           STX ATTACK
  183.           JSR COMBYT     ;Get sustain
  184.           STX SUSTAIN
  185.           JSR COMBYT     ;Get decay
  186.           STX DECAY
  187.  
  188. * The oscillator is started, volume=0
  189.  
  190.           LDX #$00
  191. EXPLP2    LDA #$40
  192.           JSR SETREG
  193.           LDA ATTACK
  194.           BEQ EXPLP1
  195.           JSR DELAY
  196.           INX
  197.           BNE EXPLP2
  198.  
  199. EXPLP1    LDX SUSTAIN    ;Get ready for sustain
  200.           BEQ EXPLP3
  201.           JSR LOOP       ;Do sustain loop
  202.  
  203. EXPLP3    LDX #$FF
  204. EXPLP4    LDA DECAY
  205.           BEQ EXPLP5
  206.           JSR DELAY
  207.           LDA #$40
  208.           DEX
  209.           JSR SETREG
  210.           CPX #25        ;Cut off at 25, which is
  211.                          ; pretty quiet
  212.           BNE EXPLP4
  213. EXPLP5    RTS
  214.  
  215. ******************************************
  216. * Set the register, transfer data
  217. ******************************************
  218.  
  219. SETREG    ORA $3A        ;Add oscillator to reg #
  220.           STA ADRSREG1   ;Store register # to access
  221.           STX SNDDAT     ;Store byte in a sound register
  222.           RTS            ;Return to caller
  223.  
  224. ******************************************
  225. * Check for legal oscillator #
  226. ******************************************
  227.  
  228. OSCCHK    LDA $3A        ;Retreive oscillator #
  229.           CMP #30        ;Compare to 30
  230.           BGE ILLERR     ;No good, error
  231.           RTS            ;It's OK, return
  232. ILLERR    JMP BADQUANT   ;Illegal quantity error
  233.  
  234. ******************************************
  235. * &LOAD - copy waveforms to sound RAM
  236. * &LOAD <start>
  237. ******************************************
  238.  
  239. LOAD      JSR CHRGET     ;Advance TXTPTR
  240.           JSR FRMNUM     ;Get start address
  241.           JSR GETADR     ;Convert to integer
  242.           LDA LINNUM     ;Get low byte of address
  243.           STA LOAD1+1    ;Save low byte as default
  244.           LDA LINNUM+1   ;Get high byte of address
  245.           STA LOAD1+2    ;Save high byte as default
  246.  
  247.           HEX AFCA00E1   ;LDA $E100CA
  248.                          ; Get sound interrupt stat
  249.           ORA #$40       ;Switch to adrs reg
  250.           STA SCREG      ;to change waveform
  251.           LDY #$00       ;Clear loop register
  252.           STY ADRSREG2   ;Clear address reg high
  253. PLOOP     STY ADRSREG1   ;Clear address reg low
  254. LOAD1     LDA $0000,Y    ;Get data from address
  255.                          ; in waveform table
  256.                          ; plus Y
  257.           STA SNDDAT     ;and save it in the Sound RAM
  258.           INY            ;Ready for another byte
  259.           BNE PLOOP      ;If not done, copy another byte
  260.           RTS            ;Copy complete!
  261.  
  262. *****************************************
  263. * &STOP <osc> -turn off an
  264. * oscillator
  265. *****************************************
  266.  
  267. STOP      HEX AFCA00E1   ;Get sout interrupt stat
  268.           STA SCREG      ;Save status - DOC regs
  269.           JSR EVAL255    ;Get oscillator #
  270.           STX $3A        ;Save it
  271.           JSR OSCCHK     ;Check for legal osc
  272.           LDA #00        ;Change frequency low
  273.           LDX #00        ;Value to save
  274.           JSR SETREG     ;Make the call
  275.           LDA #$20       ;Change frequency high
  276.           JSR SETREG     ;Make the call
  277.           LDA #$40       ;Volume
  278.           JSR SETREG     ;Make the call
  279.           LDA #$80       ;Waveform address
  280.           LDX #$00       ;Set to zero
  281.           JSR SETREG     ;Make the call
  282.           LDA #$A0       ;Clear control reg
  283.           JSR SETREG     ;Make the call
  284.           LDA #$C0       ;Waveform size
  285.           JSR SETREG     ;Make the call
  286.           JSR CHRGOT     ;Do another oscillator?
  287.           BNE STOP       ;Yes, do another
  288.           RTS            ;Back to BASIC
  289.  
  290. ******************************************
  291. * &L <osc>,<vol> - change volume
  292. * of a specified oscillator
  293. ******************************************
  294.  
  295. VOL       HEX AFCA00E1   ;Get sound interrupt stat
  296.           STA SCREG      ;Write DOC regs
  297.           JSR EVAL255    ;Get oscillator #
  298.           STX $3A        ;Save it
  299.           JSR OSCCHK     ;Check for legal osc
  300.           JSR COMBYT     ;Get volume
  301.           LDA #$40       ;Volume register #0
  302.           JSR SETREG     ;Set volume
  303.           RTS            ;Back to BASIC
  304.  
  305. ******************************************
  306. * &WAIT <length> - wait for specified
  307. * time
  308. ******************************************
  309.  
  310. WAIT      JSR EVAL255    ;Get length (0-255)
  311. LOOP      LDA #$FD       ;Put 255 in A
  312.           JSR DELAY      ;Delay
  313.           DEX            ;Decrement loop
  314.           BNE LOOP       ;Loop back if needed
  315.           RTS            ;Back to BASIC
  316.  
  317.           LST OFF
  318.